# -*- coding: utf-8 -*-
import json
import base64
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.soe.v20180724 import soe_client, models

# 重要：为了保护您的密钥安全，请不要将密钥直接写在代码中！
# 推荐使用环境变量等更安全的方式。
# 示例代码为了方便，直接在此处填写。
# 您需要将 YOUR_SECRET_ID 和 YOUR_SECRET_KEY 替换为您的真实密钥。
SECRET_ID = "YOUR_SECRET_ID"
SECRET_KEY = "YOUR_SECRET_KEY"

# 评测服务所在的地域，例如 "ap-guangzhou"
REGION = "ap-guangzhou"

# 音频文件路径，请替换为您的本地音频文件路径
# 音频要求：p_a_c_k_e_t_s.wav/mp3/silk, 16k采样率, 16bit编码, 单声道。
AUDIO_FILE_PATH = "path/to/your/audio.wav"

def read_audio_file_as_base64(file_path):
    """读取音频文件并进行Base64编码"""
    try:
        with open(file_path, "rb") as f:
            return base64.b64encode(f.read()).decode('utf-8')
    except IOError as e:
        print(f"Error reading audio file: {e}")
        return None

def main():
    try:
        # 1. 初始化凭证
        cred = credential.Credential(SECRET_ID, SECRET_KEY)

        # 2. 配置HTTP profile（可选，例如设置代理）
        http_profile = HttpProfile()
        http_profile.endpoint = "soe.tencentcloudapi.com"

        # 3. 配置Client profile
        client_profile = ClientProfile()
        client_profile.httpProfile = http_profile

        # 4. 实例化口语评测客户端
        client = soe_client.SoeClient(cred, REGION, client_profile)

        # 5. 读取并编码音频文件
        user_voice_data = read_audio_file_as_base64(AUDIO_FILE_PATH)
        if not user_voice_data:
            return

        # 6. 构造请求参数
        req = models.InitOralProcessRequest()
        params = {
            "SessionId": "test_session_12345",  # 自定义session id, 建议每次评测使用唯一id
            "EvalMode": 1,  # 评测模式: 1-句子, 2-单词, 3-段落, 4-自由说
            "ScoreCoeff": 1.0,  # 评估难度，推荐使用1.0
            "RefText": "hello world",  # 参考文本，请根据您的音频内容修改
            "WorkMode": 0, # 0：流式分片返回，1：非流式一次性返回
            "SoeAppId": "your_soe_app_id" # 业务应用ID，可在腾讯云控制台语音评测应用管理页面生成
        }
        req.from_json_string(json.dumps(params))
        
        # 7. 分片传输语音数据并获取评测结果
        # 对于流式评测，需要将音频数据切片后循环调用 TransmitOralProcess 接口
        # 这里为了简化，我们使用一次性返回的模式(WorkMode=1)并调用 TransmitOralProcessWithInit
        # 注意：TransmitOralProcessWithInit 接口更适合较短的音频
        
        init_req = models.TransmitOralProcessWithInitRequest()
        init_req.SessionId = params["SessionId"]
        init_req.RefText = params["RefText"]
        init_req.EvalMode = params["EvalMode"]
        init_req.ScoreCoeff = params["ScoreCoeff"]
        init_req.SoeAppId = params["SoeAppId"]
        
        # 语音数据相关参数
        init_req.IsEnd = 1 # 语音数据结束标志
        init_req.SeqId = 1 # 语音分片序号
        init_req.VoiceFileType = 3 # 1:raw, 2:wav, 3:mp3, 4:speex
        init_req.VoiceEncodeType = 1 # 1:pcm
        init_req.UserVoiceData = user_voice_data


        # 8. 发送请求
        resp = client.TransmitOralProcessWithInit(init_req)

        # 9. 打印结果
        # 返回的是一个JSON格式的字符串，需要解析
        print(resp.to_json_string())

    except TencentCloudSDKException as err:
        print(err)

if __name__ == "__main__":
    main() 